/*
 * @Author: 13938960424 1758142861@qq.com
 * @Date: 2023-10-30 15:34:10
 * @LastEditors: 13938960424 1758142861@qq.com
 * @LastEditTime: 2023-10-30 17:24:33
 * @FilePath: /sjf/new-xshell/muduo/source/poller.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// #pragma once

// #include <unordered_map>
// #include <vector>
// #include <cstring>
// #include <cassert>
// #include "channel.hpp"
// #include "../log/logger.hpp"

// #define MAX_EPOLLEVENTS 1024
// class Poller
// {
// public:
//     Poller()
//     {
//         _epfd = epoll_create(MAX_EPOLLEVENTS);
//         if(_epfd < 0)
//         {
//             ERR_LOG("epoll_create error,code:%d,errstring:%s",errno,strerror(errno));
//             abort();
//         }
//     };
//     //添加/修改监控事件
//     void UpdateEvent(Channel* channel)
//     {
//         bool ret = HasChannel(channel);
//         if(ret == false)
//         {
//             //没有就添加
//             _channels.insert(std::make_pair(channel->Fd(),channel));
//             return Update(channel,EPOLL_CTL_ADD);
//         }
//         return Update(channel,EPOLL_CTL_MOD);
//     }
//     //移除监控事件
//     void RemoveEvent(Channel* channel)
//     {
//         auto it = _channels.find(channel->Fd());
//         if(it != _channels.end())
//             _channels.erase(it);
//         Update(channel,EPOLL_CTL_DEL);
//     }
//     //开始监控，返回连接
//     void Poll(std::vector<Channel*> *active)
//     {
//         //对于timeout,后序修改
//         int nfds = epoll_wait(_epfd,_evs,MAX_EPOLLEVENTS,-1);
//         if(nfds < 0)
//         {
//             if(errno == EINTR)
//                 return;
//             ERR_LOG("epoll_wait error:%s\n",strerror(errno));
//             abort();
//         }
//         for(int i = 0; i < nfds; i++)
//         {
//            auto it = _channels.find(_evs[i].data.fd);
//            assert(it != _channels.end());
//            it->second->SetREvent(_evs[i].events);
//            active->push_back(it->second);
//         }
//         return;
//     }
// private:
//     //对epoll直接接口调用
//     void Update(Channel* channel,int op)
//     {
//         //int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
//         int fd = channel->Fd();
//         struct epoll_event ev;
//         ev.data.fd = fd;
//         ev.events = channel->Events();
//         int ret = epoll_ctl(_epfd,op,fd,&ev);
//         if(ret < 0)
//         {
//             ERR_LOG("epoll_ctl error!");
//             abort();//直接退出程序
//         }
//         return;
//     }
//     //判断一个channel是否添加了事件监控
//     bool HasChannel(Channel* channel)
//     {
//         auto it = _channels.find(channel->Fd());
//         if(it == _channels.end())
//             return false;
//         return true;
//     }
// private:
//     int _epfd;
//     struct epoll_event _evs[MAX_EPOLLEVENTS];
//     std::unordered_map<int,Channel*> _channels;
// };
